import * as http from 'http';
import * as fs from 'fs';

class File{
  public name:string;
  public type:string;
  public content:string;
}

const hostname = '127.0.0.1';
const port = 3000;

/** 创建服务器，解析上传文件请求，Content-Type为application/form-data */
const server = http.createServer((req:http.IncomingMessage, res:http.ServerResponse) => {

  let contentType:string = req.headers['content-type'];

  if(!contentType.startsWith('multipart/form-data')){
        res.statusCode = 404;
        res.end("请求类型错误");
        return;
  }

  /** 多部分请求，文本分隔符 */
  let separator = /^.+; boundary=[-]+(.+)$/g.exec(contentType)[1];
  console.log(separator)

  /** Buffer数据数组 */
  let buffers = [];
  req.on('data',data=>{
        buffers.push(data);
  })

  req.on('end',()=>{

      /** 拼接Buffer数组，转化为文本 */
      let buffer:Buffer = Buffer.concat(buffers);
      let content:string = buffer.toString();

      /** 文本分割为行 */
      let lines:string[] = content.split('\r\n');

      /** 临时的请求体，文本数组 */
      let temp:string[] = [];

      /** 当前的上传文件对象 */
      let current:File = new File();

      /** 上传文件列表 */
      let files:File[] = [];

      for(let i=0;i<lines.length;i++){
        let line:string = lines[i];

        /** 当前行包含分隔符，则下面内容为一部分请求 */
        if(line.includes(separator)){
            if(temp&&temp.length>0){

              /** 拼接上一个上传文件的内容文本 */
              current.content = temp.join('\r\n');

              /** 重置当前上传文件 */
              files.push(current);
              temp = [];
              current = new File();
            }
        }
        /** 文件名称行 */
        else if(line.includes('Content-Disposition')){
          current.name = /^Content-Disposition:.+filename=(.+)$/g.exec(line)[1];
        }
        /** 文件类型行 */
        else if(line.includes('Content-Type')){
          current.type = /^Content-Type: (.+)$/g.exec(line)[1];
        }
        /** 文件内容行，添加到临时数组 */
        else{
          temp.push(line);
        }
      }
      console.log(files);
      res.statusCode = 200;
      res.end();
  })
});

/** 服务器开始监听，调用钩子 */
server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});